////////////////////////////////////////////////////////////////////////////////

#ifndef _SERVER_SESSION_H_
#define _SERVER_SESSION_H_

////////////////////////////////////////////////////////////////////////////////

#include <queue>
#include <list>
#include <SDL/SDL.h>
#include <boost/asio.hpp>
using boost::asio::ip::tcp;

////////////////////////////////////////////////////////////////////////////////

#include "network_packets.h"
#include "thread.h"

////////////////////////////////////////////////////////////////////////////////

class Mutex;

////////////////////////////////////////////////////////////////////////////////


/** Game server network session
*
*  @author   Roman Pasechnik
*  @since    Jun 11th, 2009
*  @updated  Jun 11th, 2009
*/
class ServerSession
{
////////////////////////////////////////////////////////////////////////////////

public:

////////////////////////////////////////////////////////////////////////////////


    /** Constructor */
    ServerSession( ClientPackets& _recvQueue,
                   ServerPackets& _sendQueue,
                   Mutex& _sendQueueMutex,
                   Mutex& _recvQueueMutex,
                   boost::asio::io_service& _io_service );


    /** Destructor */
    virtual ~ServerSession();


////////////////////////////////////////////////////////////////////////////////


    /** Sends data to client */
    void Send();


    /** Receives data from client */
    void Receive();


    /** Start receiving and sending */
    void Start();


    /** Get send socket reference */
    tcp::socket& GetSendSocket();


    /** Get receive socket reference */
    tcp::socket& GetRecvSocket();


////////////////////////////////////////////////////////////////////////////////

private:

////////////////////////////////////////////////////////////////////////////////


    /** Socket for receiving packets */
    tcp::socket m_SendSocket;


    /** Socket for sending packets */
    tcp::socket m_RecvSocket;


    /** Received packets */
    ClientPackets& m_RecvQueue;


    /** Packets for sending */
    ServerPackets& m_SendQueue;


    /** Received packets collection mutex */
    Mutex& m_SendQueueMutex;


    /** Packets for sending collection mutex */
    Mutex& m_RecvQueueMutex;


    /** Thread for sending */
    Thread* m_SendThread;


    /** Thread for receiving */
    Thread* m_RecvThread;


////////////////////////////////////////////////////////////////////////////////
};


////////////////////////////////////////////////////////////////////////////////

#endif

////////////////////////////////////////////////////////////////////////////////

